/**
 * Animations
 * --------------------------------------------------
 * The animations in this file are "simple" - not too complex
 * and pretty easy on performance. They can be overidden
 * and enhanced easily.
 */

$transition-duration: 250ms;
$slide-in-up-function: cubic-bezier(.1, .7, .1, 1);


/**
 * Keyframes
 * --------------------------------------------------
 */

// Slide In From The Bottom To The Top
// -------------------------------

@-webkit-keyframes slideInUp {
  0%   { -webkit-transform: translate3d(0, 100%, 0); }
  100% { -webkit-transform: translate3d(0, 0, 0); }
}
@-moz-keyframes slideInUp {
  0%   { -moz-transform: translate3d(0, 100%, 0); }
  100% { -moz-transform: translate3d(0, 0, 0); }
}
@keyframes slideInUp {
  0%   { transform: translate3d(0, 100%, 0); }
  100% { transform: translate3d(0, 0, 0); }
}


// Slide Out From The Top To Bottom
// -------------------------------

@-webkit-keyframes slideOutUp {
  0%   { -webkit-transform: translate3d(0, 0, 0); }
  100% { -webkit-transform: translate3d(0, 100%, 0); }
}
@-moz-keyframes slideOutUp {
  0%   { -moz-transform: translate3d(0, 0, 0); }
  100% { -moz-transform: translate3d(0, 100%, 0); }
}
@keyframes slideOutUp {
  0%   { transform: translate3d(0, 0, 0); }
  100% { transform: translate3d(0, 100%, 0); }
}


// Slide In From Left
// -------------------------------

@-webkit-keyframes slideInFromLeft {
    from { -webkit-transform: translate3d(-100%, 0, 0); }
    to { -webkit-transform: translate3d(0, 0, 0); }
}
@-moz-keyframes slideInFromLeft {
    from { -moz-transform: translateX(-100%); }
    to { -moz-transform: translateX(0); }
}
@keyframes slideInFromLeft {
    from { transform: translateX(-100%); }
    to { transform: translateX(0); }
}


// Slide In From Right
// -------------------------------

@-webkit-keyframes slideInFromRight {
    from { -webkit-transform: translate3d(100%, 0, 0); }
    to { -webkit-transform: translate3d(0, 0, 0); }
}
@-moz-keyframes slideInFromRight {
    from { -moz-transform: translateX(100%); }
    to { -moz-transform: translateX(0); }
}
@keyframes slideInFromRight {
    from { transform: translateX(100%); }
    to { transform: translateX(0); }
}


// Slide Out To Left
// -------------------------------

@-webkit-keyframes slideOutToLeft {
  from { -webkit-transform: translate3d(0, 0, 0); }
  to { -webkit-transform: translate3d(-100%, 0, 0); }
}
@-moz-keyframes slideOutToLeft {
  from { -moz-transform: translateX(0); }
  to { -moz-transform: translateX(-100%); }
}
@keyframes slideOutToLeft {
  from { transform: translateX(0); }
  to { transform: translateX(-100%); }
}


// Slide Out To Right
// -------------------------------

@-webkit-keyframes slideOutToRight {
  from { -webkit-transform: translate3d(0, 0, 0); }
  to { -webkit-transform: translate3d(100%, 0, 0); }
}
@-moz-keyframes slideOutToRight {
  from { -moz-transform: translateX(0); }
  to { -moz-transform: translateX(100%); }
}
@keyframes slideOutToRight {
  from { transform: translateX(0); }
  to { transform: translateX(100%); }
}


// Fade Out
// -------------------------------

@-webkit-keyframes fadeOut {
  from { opacity: 1; }
  to { opacity: 0; }
}
@-moz-keyframes fadeOut {
  from { opacity: 1; }
  to { opacity: 0; }
}
@keyframes fadeOut {
  from { opacity: 1; }
  to { opacity: 0; }
}


// Fade In
// -------------------------------

@-webkit-keyframes fadeIn {
  from { opacity: 0; }
  to { opacity: 1; }
}
@-moz-keyframes fadeIn {
  from { opacity: 0; }
  to { opacity: 1; }
}
@keyframes fadeIn {
  from { opacity: 0; }
  to { opacity: 1; }
}


// Fade Half In
// -------------------------------

@-webkit-keyframes fadeInHalf {
  from { background-color: rgba(0,0,0,0); }
  to { background-color: rgba(0,0,0,0.5); }
}
@-moz-keyframes fadeInHalf {
  from { background-color: rgba(0,0,0,0); }
  to { background-color: rgba(0,0,0,0.5); }
}
@keyframes fadeInHalf {
  from { background-color: rgba(0,0,0,0); }
  to { background-color: rgba(0,0,0,0.5); }
}


// Fade Half Out
// -------------------------------

@-webkit-keyframes fadeOutHalf {
  from { background-color: rgba(0,0,0,0.5); }
  to { background-color: rgba(0,0,0,0); }
}
@-moz-keyframes fadeOutHalf {
  from { background-color: rgba(0,0,0,0.5); }
  to { background-color: rgba(0,0,0,0); }
}
@keyframes fadeOutHalf {
  from { background-color: rgba(0,0,0,0.5); }
  to { background-color: rgba(0,0,0,0); }
}

// Scale Out
// Scale from hero (1 in this case) to zero
// -------------------------------

@-webkit-keyframes scaleOut {
  from { -webkit-transform: scale(1); opacity: 1; }
  to { -webkit-transform: scale(0.8); opacity: 0; }
}
@-moz-keyframes scaleOut {
  from { -moz-transform: scale(1); opacity: 1; }
  to { -moz-transform: scale(0.8); opacity: 0; }
}
@keyframes scaleOut {
  from { transform: scale(1); opacity: 1; }
  to { transform: scale(0.8); opacity: 0; }
}

// Scale In
// Scale from 0 to hero (1 in this case)
// -------------------------------

@-webkit-keyframes scaleIn {
  from { -webkit-transform: scale(0); }
  to { -webkit-transform: scale(1); }
}
@-moz-keyframes scaleIn {
  from { -moz-transform: scale(0); }
  to { -moz-transform: scale(1); }
}
@keyframes scaleIn {
  from { transform: scale(0); }
  to { transform: scale(1); }
}

// Super Scale In
// Scale from super (1.x) to duper (1 in this case)
// -------------------------------

@-webkit-keyframes superScaleIn {
  from { -webkit-transform: scale(1.2); opacity: 0; }
  to { -webkit-transform: scale(1); opacity: 1 }
}
@-moz-keyframes superScaleIn {
  from { -moz-transform: scale(1.2); opacity: 0; }
  to { -moz-transform: scale(1); opacity: 1; }
}
@keyframes superScaleIn {
  from { transform: scale(1.2); opacity: 0; }
  to { transform: scale(1); opacity: 1; }
}

// Spin
// -------------------------------

@-webkit-keyframes spin {
  100% { -webkit-transform: rotate(360deg); }
}
@-moz-keyframes spin {
  100% { -moz-transform: rotate(360deg); }
}
@keyframes spin {
  100% { transform: rotate(360deg); }
}

.no-animation {
  > .ng-enter, &.ng-enter, > .ng-leave, &.ng-leave {
    @include transition(none);
  }
}
.noop-animation {
  > .ng-enter, &.ng-enter, > .ng-leave, &.ng-leave {
    @include transition(all cubic-bezier(0.250, 0.460, 0.450, 0.940) $transition-duration);
    position: absolute;
    top: 0;
    right: 0;
    bottom: 0;
    left: 0;
  }
}


// required for Android
.ng-animate .pane {
  position: absolute;
}


/**
 * Slide Left-Right, and Right-Left, each with the reserve
 * --------------------------------------------------
 * NEW content slides IN from the RIGHT, OLD slides OUT to the LEFT
 * Reverse: NEW content slides IN from the LEFT, OLD slides OUT to the RIGHT
 */

.slide-left-right,
.slide-right-left.reverse {
  > .ng-enter, &.ng-enter,
  > .ng-leave, &.ng-leave {
    @include transition(all ease-in-out $transition-duration);
    position: absolute;
    top: 0;
    right: 0;
    bottom: 0;
    left: 0;
  }
  > .ng-enter, &.ng-enter {
    /* NEW content placed far RIGHT BEFORE it slides IN from the RIGHT */
    @include translate3d(100%, 0, 0);
  }
  > .ng-enter.ng-enter-active, &.ng-enter.ng-enter-active {
    /* NEW content ACTIVELY sliding IN from the RIGHT */
    @include translate3d(0, 0, 0);
  }
  > .ng-leave.ng-leave-active, &.ng-leave.ng-leave-active {
    /* OLD content ACTIVELY sliding OUT to the LEFT */
    @include translate3d(-100%, 0, 0);
  }
}

.slide-left-right.reverse,
.slide-right-left {
  > .ng-enter, &.ng-enter, > .ng-leave, &.ng-leave {
    @include transition(all ease-in-out $transition-duration);
    position: absolute;
    top: 0;
    right: 0;
    bottom: 0;
    left: 0;
  }
  > .ng-enter, &.ng-enter {
    /* NEW content placed far LEFT BEFORE it slides IN from the LEFT */
    @include translate3d(-100%, 0, 0);
  }
  > .ng-enter.ng-enter-active, &.ng-enter.ng-enter-active {
    /* NEW content ACTIVELY sliding IN from the LEFT */
    @include translate3d(0, 0, 0);
  }
  > .ng-leave.ng-leave-active, &.ng-leave.ng-leave-active {
    /* OLD content ACTIVELY sliding OUT to the RIGHT */
    @include translate3d(100%, 0, 0);
  }
}


/**
 * iOS7 style slide left to right
 * --------------------------------------------------
 */
$ios7-timing-function: cubic-bezier(0.4, 0.6, 0.2, 1);
$ios7-transition-duration: 340ms;
$ios-transition-box-shadow-start: -200px 0px 200px rgba(0,0,0,0), -5px 0px 5px rgba(0,0,0,0.01);
$ios-transition-box-shadow-end: -200px 0px 200px rgba(0,0,0,0.15), -5px 0px 5px rgba(0,0,0,0.18);

.slide-left-right-ios7,
.slide-right-left-ios7.reverse {
  > .ng-enter, &.ng-enter,
  > .ng-leave, &.ng-leave {
    @include transition(all $ios7-timing-function $ios7-transition-duration);
    position: absolute;
    top: 0;
    right: -1px;
    bottom: 0;
    left: -1px;
    width: auto;
    &:not(.bar) {
      border-right: none;
      border-left: none;
    }
    border-right: none;
    border-left: none;
  }
  > .ng-enter, &.ng-enter {
    /* NEW content placed far RIGHT BEFORE it slides IN from the RIGHT */
    @include translate3d(100%, 0, 0);
  }
  > .ng-leave, &.ng-leave {
    z-index: 1;
  }
  > .ng-enter.ng-enter-active, &.ng-enter.ng-enter-active {
    /* NEW content ACTIVELY sliding IN from the RIGHT */
    @include translate3d(0, 0, 0);
  }
  > .ng-leave.ng-leave-active, &.ng-leave.ng-leave-active {
    /* OLD content ACTIVELY sliding OUT to the LEFT */
    @include translate3d(-15%, 0, 0);
  }
}
.slide-left-right-ios7.reverse,
.slide-right-left-ios7 {
  > .ng-enter, &.ng-enter, > .ng-leave, &.ng-leave {
    @include transition(all $ios7-timing-function $ios7-transition-duration);
    position: absolute;
    top: 0;
    right: -1px;
    bottom: 0;
    left: -1px;
    width: auto;
    border-right: none;
    border-left: none;
  }
  > .ng-enter, &.ng-enter {
    /* NEW content placed far LEFT BEFORE it slides IN from the LEFT */
    @include translate3d(-15%, 0, 0);
  }
  > .ng-leave, &.ng-leave {
    z-index: 2;
  }
  > .ng-enter.ng-enter-active, &.ng-enter.ng-enter-active {
    /* NEW content ACTIVELY sliding IN from the LEFT */
    @include translate3d(0, 0, 0);
  }
  > .ng-leave.ng-leave-active, &.ng-leave.ng-leave-active {
    /* OLD content ACTIVELY sliding OUT to the RIGHT */
    @include translate3d(100%, 0, 0);
  }
}

/**
 * iPad doesn't like box shadows
 */
/*
.grade-a:not(.platform-ipad) {
  .slide-left-right-ios7, .slide-right-left-ios7.reverse {
    > .ng-enter, &.ng-enter {
      box-shadow: $ios-transition-box-shadow-start;
    }
    > .ng-enter.ng-enter-active, &.ng-enter.ng-enter-active {
      box-shadow: $ios-transition-box-shadow-end;
    }
  }
  .slide-left-right-ios7.reverse, .slide-right-left-ios7 {
    > .ng-leave, &.ng-leave {
      //box-shadow: $ios-transition-box-shadow-end;
    }
    > .ng-leave.ng-leave-active, &.ng-leave.ng-leave-active {
      //box-shadow: $ios-transition-box-shadow-start;
    }
  }
}
*/
.grade-a.platform-ipad {
  .slide-left-right-ios7, .slide-right-left-ios7.reverse {
    > .ng-enter, &.ng-enter {
      border-left: 1px solid #ddd;
    }
  }

  .slide-left-right-ios7.reverse, .slide-right-left-ios7 {
    > .ng-leave, &.ng-leave {
      border-left: 1px solid #ddd;
    }
  }
}


/**
 * Android style "pop in" with fade and scale
 */
.fade-explode {
  > .ng-enter, &.ng-enter,
  > .ng-leave, &.ng-leave {
    @include transition(all ease-out 300ms);
    position: absolute;
    top: 0;
    right: -1px;
    bottom: 0;
    left: -1px;
    width: auto;
    &:not(.bar) {
      border-right: 1px solid #ddd;
      border-left: 1px solid #ddd;
    }
  }
  > .ng-enter, &.ng-enter {
    /* NEW content placed far RIGHT BEFORE it slides IN from the RIGHT */
    @include scale(1.6);
    opacity: 0;
    z-index: 2;
  }
  > .ng-leave, &.ng-leave {
    z-index: 1;
  }
  > .ng-enter.ng-enter-active, &.ng-enter.ng-enter-active {
    /* NEW content ACTIVELY sliding IN from the RIGHT */
    @include scale(1);
    opacity: 1;
  }
  > .ng-leave.ng-leave-active, &.ng-leave.ng-leave-active {
    /* OLD content ACTIVELY sliding OUT to the LEFT */
    @include scale(0.95);
  }
}

.fade-explode.reverse {
  > .ng-enter, &.ng-enter, > .ng-leave, &.ng-leave {
    @include transition(all ease-out 300ms);
    position: absolute;
    top: 0;
    right: -1px;
    bottom: 0;
    left: -1px;
    width: auto;
    &:not(.bar) {
      border-right: 1px solid #ddd;
      border-left: 1px solid #ddd;
    }
  }
  > .ng-enter, &.ng-enter {
    /* NEW content placed far LEFT BEFORE it slides IN from the LEFT */
    @include scale(0.95);
    opacity: 0;
    z-index: 1;
  }
  > .ng-leave, &.ng-leave {
    @include scale(1);
    opacity: 1;
    z-index: 2;
  }
  > .ng-enter.ng-enter-active, &.ng-enter.ng-enter-active {
    @include scale(1);
    opacity: 1;
  }
  > .ng-leave.ng-leave-active, &.ng-leave.ng-leave-active {
    @include scale(1.6);
    opacity: 0;
  }
}

/**
 * Android style "pop in" with fade and scale
 */
.fade-implode {
  > .ng-enter, &.ng-enter,
  > .ng-leave, &.ng-leave {
    @include transition(all ease-out 200ms);
    position: absolute;
    top: 0;
    right: -1px;
    bottom: 0;
    left: -1px;
    width: auto;
    &:not(.bar) {
      border-right: 1px solid #ddd;
      border-left: 1px solid #ddd;
    }
  }
  > .ng-enter, &.ng-enter {
    /* NEW content placed far RIGHT BEFORE it slides IN from the RIGHT */
    @include scale(0.8);
    opacity: 0;
    z-index: 2;
  }
  > .ng-leave, &.ng-leave {
    z-index: 1;
  }
  > .ng-enter.ng-enter-active, &.ng-enter.ng-enter-active {
    /* NEW content */
    @include scale(1);
    opacity: 1;
  }
  > .ng-leave.ng-leave-active, &.ng-leave.ng-leave-active {
  }
}

.fade-implode.reverse {
  > .ng-enter, &.ng-enter, > .ng-leave, &.ng-leave {
    @include transition(all ease-out 200ms);
    position: absolute;
    top: 0;
    right: -1px;
    bottom: 0;
    left: -1px;
    width: auto;
    border-right: 1px solid #ddd;
    border-left: 1px solid #ddd;
  }
  > .ng-enter, &.ng-enter {
    @include scale(1);
    opacity: 1;
    z-index: 1;
  }
  > .ng-leave, &.ng-leave {
    @include scale(1);
    opacity: 1;
    z-index: 2;
  }
  > .ng-enter.ng-enter-active, &.ng-enter.ng-enter-active {
    opacity: 1;
  }
  > .ng-leave.ng-leave-active, &.ng-leave.ng-leave-active {
    @include scale(0.8);
    opacity: 0;
  }
}

/**
 * Simple slide-in animation
 */
.slide-in-left {
  @include translate3d(0%,0,0);
  &.ng-enter, > .ng-enter {
    @include animation-name(slideInFromLeft);
    @include animation-duration($transition-duration);
    @include animation-timing-function(ease-in-out);
    @include animation-fill-mode(both);
  }
  &.ng-leave, > .ng-leave {
    @include animation-name(slideOutToLeft);
    @include animation-duration($transition-duration);
    @include animation-timing-function(ease-in-out);
    @include animation-fill-mode(both);
  }
}


.slide-in-left-add {
  @include translate3d(100%,0,0);
  @include animation-duration($transition-duration);
  @include animation-timing-function(ease-in-out);
  @include animation-fill-mode(both);
}
.slide-in-left-add-active {
  @include animation-name(slideInFromLeft);
}

.slide-out-left {
  @include translate3d(-100%,0,0);
  &.ng-enter, > .ng-enter {
    @include animation-name(slideOutToLeft);
    @include animation-duration($transition-duration);
    @include animation-timing-function(ease-in-out);
    @include animation-fill-mode(both);
  }
  &.ng-leave, > .ng-leave {
    @include animation-name(slideOutToLeft);
    @include animation-duration($transition-duration);
    @include animation-timing-function(ease-in-out);
    @include animation-fill-mode(both);
  }
}

.slide-out-left {
}

.slide-out-left-add {
  @include translate3d(0,0,0);
  @include animation-duration($transition-duration);
  @include animation-timing-function(ease-in-out);
  @include animation-fill-mode(both);
}
.slide-out-left-add-active {
  @include animation-name(slideOutToLeft);
}

.slide-in-right {
  @include translate3d(0%,0,0);
  &.ng-enter, > .ng-enter {
    @include animation-name(slideInFromRight);
    @include animation-duration($transition-duration);
    @include animation-timing-function(ease-in-out);
    @include animation-fill-mode(both);
  }
  &.ng-leave, > .ng-leave {
    @include animation-name(slideOutToRight);
    @include animation-duration($transition-duration);
    @include animation-timing-function(ease-in-out);
    @include animation-fill-mode(both);
  }
}

.slide-in-right-add {
  @include translate3d(-100%,0,0);
  @include animation-duration($transition-duration);
  @include animation-timing-function(ease-in-out);
  @include animation-fill-mode(both);
}
.slide-in-right-add-active {
  @include animation-name(slideInFromRight);
}

.slide-out-right {
  @include translate3d(100%,0,0);
  &.ng-enter, > .ng-enter {
    @include animation-name(slideOutToRight);
    @include animation-duration($transition-duration);
    @include animation-timing-function(ease-in-out);
    @include animation-fill-mode(both);
  }
  &.ng-leave, > .ng-leave {
    @include animation-name(slideOutToRight);
    @include animation-duration($transition-duration);
    @include animation-timing-function(ease-in-out);
    @include animation-fill-mode(both);
  }
}

.slide-out-right-add {
  @include translate3d(0,0,0);
  @include animation-duration($transition-duration);
  @include animation-timing-function(ease-in-out);
  @include animation-fill-mode(both);
}
.slide-out-right-add-active {
  @include animation-name(slideOutToRight);
}


/**
 * Slide up from the bottom, used for modals
 * --------------------------------------------------
 */

.slide-in-up {
  @include translate3d(0, 100%, 0);
}
.slide-in-up.ng-enter,
.slide-in-up > .ng-enter {
  @include transition(all $slide-in-up-function 400ms);
}
.slide-in-up.ng-enter-active,
.slide-in-up > .ng-enter-active {
  @include translate3d(0, 0, 0);
}

.slide-in-up.ng-leave,
.slide-in-up > .ng-leave {
  @include transition(all ease-in-out 250ms);
}


.fade-in {
  @include animation(fadeOut 0.3s);
  &.active {
    @include animation(fadeIn 0.3s);
  }
}

.fade-in-not-out {
  &.ng-enter, .ng-enter {
    @include animation(fadeIn 0.3s);
    position: relative;
  }
  &.ng-leave, .ng-leave {
    display: none;
  }
}



/**
 * Some component specific animations
 */
$nav-title-slide-ios7-delay: $ios7-transition-duration;
.nav-title-slide-ios7 {
  &:not(.no-animation) .button.back-button {
    @include transition(all $nav-title-slide-ios7-delay);
    @include transition-timing-function($ios7-timing-function);

    @include translate3d(0%, 0, 0);
    opacity: 1;
    &.active, &.activated {
      opacity: 0.5;
    }
    &.ng-hide {
      opacity: 0;
      @include translate3d(30%, 0, 0);
    }
    &.ng-hide-add,
    &.ng-hide-remove {
      display: block !important;
    }
    &.ng-hide-add {
      position: absolute;
    }
  }
  > .ng-enter, &.ng-enter,
  > .ng-leave, &.ng-leave {
    @include transition(all $nav-title-slide-ios7-delay);
    @include transition-timing-function($ios7-timing-function);
    opacity: 1;
  }
  > .ng-enter, &.ng-enter {
    @include translate3d(30%, 0, 0);
    opacity: 0;
    &.title {
      @include translate3d(100%, 0, 0);
    }
  }
  > .ng-enter.ng-enter-active, &.ng-enter.ng-enter-active {
    @include translate3d(0, 0, 0);
    opacity: 1;
  }
  > .ng-leave.ng-leave-active, &.ng-leave.ng-leave-active {
    @include translate3d(-30%, 0, 0);
    opacity: 0;
  }

  &.reverse {
    > .ng-enter, &.ng-enter,
    > .ng-leave, &.ng-leave {
      @include transition(all $nav-title-slide-ios7-delay);
      @include transition-timing-function($ios7-timing-function);
      opacity: 1;
    }
    > .ng-enter, &.ng-enter {
      @include translate3d(-30%, 0, 0);
      opacity: 0;
    }
    > .ng-enter.ng-enter-active, &.ng-enter.ng-enter-active {
      @include translate3d(0, 0, 0);
      opacity: 1;
    }
    > .ng-leave.ng-leave-active, &.ng-leave.ng-leave-active {
      @include translate3d(100%, 0, 0);
      opacity: 0;
    }
  }
}

$nav-title-android-delay: 200ms;
$nav-title-android-timing-function: linear;

.nav-title-android {
  &:not(.no-animation) .button.back-button {
    @include transition(all $nav-title-android-delay);
    @include transition-timing-function($nav-title-android-timing-function);
    opacity: 1;
    &.ng-hide {
      opacity: 0;
    }
    &.ng-hide-add,
    &.ng-hide-remove {
      display: block !important;
    }
    &.ng-hide-add {
      position: absolute;
    }
    &.ng-hide-remove {
    }
  }
  > .ng-enter, &.ng-enter,
  > .ng-leave, &.ng-leave {
    @include transition(all $nav-title-android-delay);
    @include transition-timing-function($nav-title-android-timing-function);
  }
  > .ng-enter, &.ng-enter {
    opacity: 0;
  }
  > .ng-enter.ng-enter-active, &.ng-enter.ng-enter-active {
    opacity: 1;
  }
  > .ng-leave.ng-leave-active, &.ng-leave.ng-leave-active {
    opacity: 0;
  }
}
